//
// showdown.js -- A javascript port of Markdown.
//
// Copyright (c) 2007 John Fraser.
//
// Original Markdown Copyright (c) 2004-2005 John Gruber
//   <http://daringfireball.net/projects/markdown/>
//
// Redistributable under a BSD-style open source license.
// See license.txt for more information.
//
// The full source distribution is at:
//
//				A A L
//				T C A
//				T K B
//
//   <http://www.attacklab.net/>
//
//
// Wherever possible, Showdown is a straight, line-by-line port
// of the Perl version of Markdown.
//
// This is not a normal parser design; it's basically just a
// series of string substitutions.  It's hard to read and
// maintain this way,  but keeping Showdown close to the original
// design makes it easier to port new features.
//
// More importantly, Showdown behaves like markdown.pl in most
// edge cases.  So web applications can do client-side preview
// in Javascript, and then build identical HTML on the server.
//
// This port needs the new RegExp functionality of ECMA 262,
// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers
// should do fine.  Even with the new regular expression features,
// We do a lot of work to emulate Perl's regex functionality.
// The tricky changes in this file mostly have the "attacklab:"
// label.  Major or self-explanatory changes don't.
//
// Smart diff tools like Araxis Merge will be able to match up
// this file with markdown.pl in a useful way.  A little tweaking
// helps: in a copy of markdown.pl, replace "#" with "//" and
// replace "$text" with "text".  Be sure to ignore whitespace
// and line endings.
//
//
// Showdown usage:
//
//   var text = "Markdown *rocks*.";
//
//   var converter = new Showdown.converter();
//   var html = converter.makeHtml(text);
//
//   alert(html);
//
// Note: move the sample code to the bottom of this
// file before uncommenting it.
//
//
// Showdown namespace
//
var Showdown = {extensions: {}}, forEach = Showdown.forEach = function (a, b) {
    if (typeof a.forEach == "function")a.forEach(b); else {
        var c, d = a.length;
        for (c = 0; c < d; c++)b(a[c], c, a)
    }
}, stdExtName = function (a) {
    return a.replace(/[_-]||\s/g, "").toLowerCase()
};
Showdown.converter = function (a) {
    var b, c, d, e = 0, f = [], g = [];
    if (typeof module != "undefind" && typeof exports != "undefined" && typeof require != "undefind") {
        var h = require("fs");
        if (h) {
            var i = h.readdirSync((__dirname || ".") + "/extensions").filter(function (a) {
                return ~a.indexOf(".js")
            }).map(function (a) {
                return a.replace(/\.js$/, "")
            });
            Showdown.forEach(i, function (a) {
                var b = stdExtName(a);
                Showdown.extensions[b] = require("./extensions/" + a)
            })
        }
    }
    this.makeHtml = function (a) {
        return b = {}, c = {}, d = [], a = a.replace(/~/g, "~T"), a = a.replace(/\$/g, "~D"), a = a.replace(/\r\n/g, "\n"), a = a.replace(/\r/g, "\n"), a = "\n\n" + a + "\n\n", a = M(a), a = a.replace(/^[ \t]+$/mg, ""), Showdown.forEach(f, function (b) {
            a = k(b, a)
        }), a = z(a), a = m(a), a = l(a), a = o(a), a = K(a), a = a.replace(/~D/g, "$$"), a = a.replace(/~T/g, "~"), Showdown.forEach(g, function (b) {
            a = k(b, a)
        }), a
    };
    if (a && a.extensions) {
        var j = this;
        Showdown.forEach(a.extensions, function (a) {
            typeof a == "string" && (a = Showdown.extensions[stdExtName(a)]);
            if (typeof a != "function")throw"Extension '" + a + "' could not be loaded.  It was either not found or is not a valid extension.";
            Showdown.forEach(a(j), function (a) {
                a.type ? a.type === "language" || a.type === "lang" ? f.push(a) : (a.type === "output" || a.type === "html") && g.push(a) : g.push(a)
            })
        })
    }
    var k = function (a, b) {
        if (a.regex) {
            var c = new RegExp(a.regex, "g");
            return b.replace(c, a.replace)
        }
        if (a.filter)return a.filter(b)
    }, l = function (a) {
        return a += "~0", a = a.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|(?=~0))/gm, function (a, d, e, f, g) {
            return d = d.toLowerCase(), b[d] = G(e), f ? f + g : (g && (c[d] = g.replace(/"/g, "&quot;")), "")
        }), a = a.replace(/~0/, ""), a
    }, m = function (a) {
        a = a.replace(/\n/g, "\n\n");
        var b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside", c = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside";
        return a = a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, n), a = a.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?<\/\2>[ \t]*(?=\n+)\n)/gm, n), a = a.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, n), a = a.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g, n), a = a.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, n), a = a.replace(/\n\n/g, "\n"), a
    }, n = function (a, b) {
        var c = b;
        return c = c.replace(/\n\n/g, "\n"), c = c.replace(/^\n/, ""), c = c.replace(/\n+$/g, ""), c = "\n\n~K" + (d.push(c) - 1) + "K\n\n", c
    }, o = function (a) {
        a = v(a);
        var b = A("<hr />");
        return a = a.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, b), a = a.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm, b), a = a.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm, b), a = x(a), a = y(a), a = E(a), a = m(a), a = F(a), a
    }, p = function (a) {
        return a = B(a), a = q(a), a = H(a), a = t(a), a = r(a), a = I(a), a = G(a), a = D(a), a = a.replace(/  +\n/g, " <br />\n"), a
    }, q = function (a) {
        var b = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;
        return a = a.replace(b, function (a) {
            var b = a.replace(/(.)<\/?code>(?=.)/g, "$1`");
            return b = N(b, "\\`*_"), b
        }), a
    }, r = function (a) {
        return a = a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, s), a = a.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?(?:\(.*?\).*?)?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, s), a = a.replace(/(\[([^\[\]]+)\])()()()()()/g, s), a
    }, s = function (a, d, e, f, g, h, i, j) {
        j == undefined && (j = "");
        var k = d, l = e, m = f.toLowerCase(), n = g, o = j;
        if (n == "") {
            m == "" && (m = l.toLowerCase().replace(/ ?\n/g, " ")), n = "#" + m;
            if (b[m] != undefined)n = b[m], c[m] != undefined && (o = c[m]); else {
                if (!(k.search(/\(\s*\)$/m) > -1))return k;
                n = ""
            }
        }
        n = N(n, "*_");
        var p = '<a href="' + n + '"';
        return o != "" && (o = o.replace(/"/g, "&quot;"), o = N(o, "*_"), p += ' title="' + o + '"'), p += ">" + l + "</a>", p
    }, t = function (a) {
        return a = a.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, u), a = a.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, u), a
    }, u = function (a, d, e, f, g, h, i, j) {
        var k = d, l = e, m = f.toLowerCase(), n = g, o = j;
        o || (o = "");
        if (n == "") {
            m == "" && (m = l.toLowerCase().replace(/ ?\n/g, " ")), n = "#" + m;
            if (b[m] == undefined)return k;
            n = b[m], c[m] != undefined && (o = c[m])
        }
        l = l.replace(/"/g, "&quot;"), n = N(n, "*_");
        var p = '<img src="' + n + '" alt="' + l + '"';
        return o = o.replace(/"/g, "&quot;"), o = N(o, "*_"), p += ' title="' + o + '"', p += " />", p
    }, v = function (a) {
        function b(a) {
            return a.replace(/[^\w]/g, "").toLowerCase()
        }

        return a = a.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm, function (a, c) {
            return A('<h1 id="' + b(c) + '">' + p(c) + "</h1>")
        }), a = a.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, function (a, c) {
            return A('<h2 id="' + b(c) + '">' + p(c) + "</h2>")
        }), a = a.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, function (a, c, d) {
            var e = c.length;
            return A("<h" + e + ' id="' + b(d) + '">' + p(d) + "</h" + e + ">")
        }), a
    }, w, x = function (a) {
        a += "~0";
        var b = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
        return e ? a = a.replace(b, function (a, b, c) {
            var d = b, e = c.search(/[*+-]/g) > -1 ? "ul" : "ol";
            d = d.replace(/\n{2,}/g, "\n\n\n");
            var f = w(d);
            return f = f.replace(/\s+$/, ""), f = "<" + e + ">" + f + "</" + e + ">\n", f
        }) : (b = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g, a = a.replace(b, function (a, b, c, d) {
            var e = b, f = c, g = d.search(/[*+-]/g) > -1 ? "ul" : "ol", f = f.replace(/\n{2,}/g, "\n\n\n"), h = w(f);
            return h = e + "<" + g + ">\n" + h + "</" + g + ">\n", h
        })), a = a.replace(/~0/, ""), a
    };
    w = function (a) {
        return e++, a = a.replace(/\n{2,}$/, "\n"), a += "~0", a = a.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm, function (a, b, c, d, e) {
            var f = e, g = b, h = c;
            return g || f.search(/\n{2,}/) > -1 ? f = o(L(f)) : (f = x(L(f)), f = f.replace(/\n$/, ""), f = p(f)), "<li>" + f + "</li>\n"
        }), a = a.replace(/~0/g, ""), e--, a
    };
    var y = function (a) {
        return a += "~0", a = a.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g, function (a, b, c) {
            var d = b, e = c;
            return d = C(L(d)), d = M(d), d = d.replace(/^\n+/g, ""), d = d.replace(/\n+$/g, ""), d = "<pre>" + d + "\n</pre>", A(d) + e
        }), a = a.replace(/~0/, ""), a
    }, z = function (a) {
        return a += "~0", a = a.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, function (a, b, c) {
            var d = b, e = c;
            return e = C(e), e = M(e), e = e.replace(/^\n+/g, ""), e = e.replace(/\n+$/g, ""), e = "<pre>" + e + "\n</pre>", A(e)
        }), a = a.replace(/~0/, ""), a
    }, A = function (a) {
        return a = a.replace(/(^\n+|\n+$)/g, ""), "\n\n~K" + (d.push(a) - 1) + "K\n\n"
    }, B = function (a) {
        return a = a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, function (a, b, c, d, e) {
            var f = d;
            return f = f.replace(/^([ \t]*)/g, ""), f = f.replace(/[ \t]*$/g, ""), f = C(f), b + "<code>" + f + "</code>"
        }), a
    }, C = function (a) {
        return a = a.replace(/&/g, "&amp;"), a = a.replace(/</g, "&lt;"), a = a.replace(/>/g, "&gt;"), a = N(a, "*_{}[]\\", !1), a
    }, D = function (a) {
        return a = a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, "<strong>$2</strong>"), a = a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, "<em>$2</em>"), a
    }, E = function (a) {
        return a = a.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, function (a, b) {
            var c = b;
            return c = c.replace(/^[ \t]*>[ \t]?/gm, "~0"), c = c.replace(/~0/g, ""), c = c.replace(/^[ \t]+$/gm, ""), c = o(c), c = c.replace(/(^|\n)/g, "$1  "), c = c.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm, function (a, b) {
                var c = b;
                return c = c.replace(/^  /mg, "~0"), c = c.replace(/~0/g, ""), c
            }), A("<blockquote>\n" + c + "\n</blockquote>")
        }), a
    }, F = function (a) {
        a = a.replace(/^\n+/g, ""), a = a.replace(/\n+$/g, "");
        var b = a.split(/\n{2,}/g), c = [], e = b.length;
        for (var f = 0; f < e; f++) {
            var g = b[f];
            g.search(/~K(\d+)K/g) >= 0 ? c.push(g) : g.search(/\S/) >= 0 && (g = p(g), g = g.replace(/^([ \t]*)/g, "<p>"), g += "</p>", c.push(g))
        }
        e = c.length;
        for (var f = 0; f < e; f++)while (c[f].search(/~K(\d+)K/) >= 0) {
            var h = d[RegExp.$1];
            h = h.replace(/\$/g, "$$$$"), c[f] = c[f].replace(/~K\d+K/, h)
        }
        return c.join("\n\n")
    }, G = function (a) {
        return a = a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&amp;"), a = a.replace(/<(?![a-z\/?\$!])/gi, "&lt;"), a
    }, H = function (a) {
        return a = a.replace(/\\(\\)/g, O), a = a.replace(/\\([`*_{}\[\]()>#+-.!])/g, O), a
    }, I = function (a) {
        return a = a.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi, '<a href="$1">$1</a>'), a = a.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, function (a, b) {
            return J(K(b))
        }), a
    }, J = function (a) {
        var b = [function (a) {
            return "&#" + a.charCodeAt(0) + ";"
        }, function (a) {
            return "&#x" + a.charCodeAt(0).toString(16) + ";"
        }, function (a) {
            return a
        }];
        return a = "mailto:" + a, a = a.replace(/./g, function (a) {
            if (a == "@")a = b[Math.floor(Math.random() * 2)](a); else if (a != ":") {
                var c = Math.random();
                a = c > .9 ? b[2](a) : c > .45 ? b[1](a) : b[0](a)
            }
            return a
        }), a = '<a href="' + a + '">' + a + "</a>", a = a.replace(/">.+:/g, '">'), a
    }, K = function (a) {
        return a = a.replace(/~E(\d+)E/g, function (a, b) {
            var c = parseInt(b);
            return String.fromCharCode(c)
        }), a
    }, L = function (a) {
        return a = a.replace(/^(\t|[ ]{1,4})/gm, "~0"), a = a.replace(/~0/g, ""), a
    }, M = function (a) {
        return a = a.replace(/\t(?=\t)/g, "    "), a = a.replace(/\t/g, "~A~B"), a = a.replace(/~B(.+?)~A/g, function (a, b, c) {
            var d = b, e = 4 - d.length % 4;
            for (var f = 0; f < e; f++)d += " ";
            return d
        }), a = a.replace(/~A/g, "    "), a = a.replace(/~B/g, ""), a
    }, N = function (a, b, c) {
        var d = "([" + b.replace(/([\[\]\\])/g, "\\$1") + "])";
        c && (d = "\\\\" + d);
        var e = new RegExp(d, "g");
        return a = a.replace(e, O), a
    }, O = function (a, b) {
        var c = b.charCodeAt(0);
        return "~E" + c + "E"
    }
}, typeof module != "undefined" && (module.exports = Showdown), typeof define == "function" && define.amd && define("showdown", function () {
    return Showdown
});